﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using QldtSdh.DAL.Models;
using QldtSdh.GUI.DuLieu;
using QldtSdh.Utils;

namespace QldtSdh.BLL
{
    public partial class BizHocVien
    {
        /// <summary>
        /// Lấy danh sách học viên theo lớp
        /// </summary>
        /// <returns></returns>
        public static MySortableBindingList<HocVien> GetList(string guidIdLop)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var dsbl = db.BaoLuuDbSet.Where(e => e.NgayNhapHocLai.HasValue == false).Select(e => e.MaHocVien);
                var ls= db.HocVienDbSet.Where(e => e.MaLopKhoaNganhGUID == guidIdLop && !dsbl.Contains(e.MaHocVien)).OrderBy(e => e.MaHocVien).OrderBy(e => e.Ten).ThenBy(e => e.HoDem).ToList();
                var lsSort = new MySortableBindingList<HocVien>(ls);
                return lsSort;
            }
        }

        /// <summary>
        /// Lấy toàn bộ danh sách học viên theo khóa học
        /// </summary>
        /// <param name="maKhoa"></param>
        /// <returns></returns>
        public static List<HocVien> GetListTheoKhoa(string maKhoa, string maNganh = "", bool daTotNghiep = false)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var dsLopQuery = db.LopKhoaNganhDbSet.Where(e => e.KhoaHoc_NganhDaoTao.MaKhoaHocGUID == maKhoa);
                if (!string.IsNullOrEmpty(maNganh))
                    dsLopQuery = dsLopQuery.Where(e => e.KhoaHoc_NganhDaoTao.MaNganhDaoTaoGUID == maNganh);

                var dsLop = dsLopQuery.Select(e => e.MaLopKhoaNganhGUID);
                var ls = db.HocVienDbSet.Where(e => dsLop.Contains(e.MaLopKhoaNganhGUID));
                if (daTotNghiep)
                    ls = ls.Where(e => e.DaTotNghiep == true);
                return ls.OrderBy(e => e.MaLopKhoaNganhGUID).ThenBy(e => e.Ten).ThenBy(e => e.HoDem).ToList();
            }
        }

        /// <summary>
        /// Lấy danh sách học viên theo lớp kèm bảng điểm kèm theo thông tin trên bảng điểm
        /// </summary>
        /// <param name="guidIdLop"></param>
        /// <returns></returns>
        public static List<HocVien> GetListToFinal(string guidIdLop)
        {

            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var ls = db.HocVienDbSet.Where(e => e.MaLopKhoaNganhGUID == guidIdLop && (e.DaTotNghiep == false || !e.DaTotNghiep.HasValue)).OrderBy(e => e.Ten).ThenBy(e => e.HoDem).ToList();
                var lsHocVien = new List<HocVien>();
                if (ls != null && ls.Count > 0)
                {
                    foreach (var item in ls)
                    {
                        //Nếu học viên này đang bảo lưu thì không hiển thị ra ở đây
                        var isBaoLuu = db.BaoLuuDbSet.Where(e => e.MaHocVien == item.MaHocVien && !e.NgayNhapHocLai.HasValue).FirstOrDefault();
                        if (isBaoLuu != null)
                            continue;
                        var listKetQuaHocTap = db.HocVien_KetQuaHocTapDbSet.Where(e => e.MaHocVien == item.MaHocVien).ToList();
                        if (listKetQuaHocTap != null && listKetQuaHocTap.Count > 0)
                        {
                            item._TinChiTichLuy = listKetQuaHocTap.Sum(e => e.HocPhan.SoTinChi);
                            var tongDiem = listKetQuaHocTap.Sum(e => e.HocPhan.SoTinChi * e.DiemHe10);
                            if (item._TinChiTichLuy.HasValue && item._TinChiTichLuy.Value != 0)
                                item._DiemTichLuy = (double)tongDiem / item._TinChiTichLuy.Value;
                            else
                                item._DiemTichLuy = 0;
                        }
                        lsHocVien.Add(item);
                    }
                    return lsHocVien;
                }
                else
                    return null;

            }
        }

        public static HocVien GetByID(string maHocVien)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                return db.HocVienDbSet.Where(e => e.MaHocVien == maHocVien).FirstOrDefault();
            }
        }

        public static bool IsExistByID(string maHocVien)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                return db.HocVienDbSet.Where(e => e.MaHocVien == maHocVien).FirstOrDefault() == null ? false : true;
            }
        }

        public static CODE_RESULT_RETURN Add(HocVien obj, KhoaHoc khoahoc, NganhDaoTao nganh)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                int defOrder = 0;
                HocVien hv = null;
                do
                {
                    defOrder++;
                    obj.MaHocVien = GenerateIDHocVien(khoahoc.NamTuyenSinh, nganh.MaNganhDaoTao, defOrder);
                    hv = db.HocVienDbSet.Where(e => e.MaHocVien == obj.MaHocVien).FirstOrDefault();
                } while (hv != null);
                db.HocVienDbSet.Add(obj);
                db.SaveChanges();
                NhatKyHoatDong nhatKy = new NhatKyHoatDong();
                BizNhatKyHoatDong.InitData<HocVien>(nhatKy, null, obj.MaHocVien, LOAIDOITUONG.HỌC_VIÊN, LOAITHAOTAC.Thêm);
                BizNhatKyHoatDong.Add<HocVien>(nhatKy, obj);
                return CODE_RESULT_RETURN.ThanhCong;
            }
        }

        public static CODE_RESULT_RETURN Update(HocVien obj)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var _hp = db.HocVienDbSet.Where(e => e.MaHocVien == obj.MaHocVien).FirstOrDefault();
                if (_hp == null)
                    return CODE_RESULT_RETURN.ThatBai;
                NhatKyHoatDong nhatKy = new NhatKyHoatDong();
                BizNhatKyHoatDong.InitData<HocVien>(nhatKy, _hp, obj.MaHocVien, LOAIDOITUONG.HỌC_VIÊN, LOAITHAOTAC.Chỉnh_sửa);

                _hp.MaDotTuyenSinhGUID = obj.MaDotTuyenSinhGUID;
                _hp.HoDem = obj.HoDem;
                _hp.Ten = obj.Ten;
                _hp.GioiTinh = obj.GioiTinh;
                _hp.NgaySinh = obj.NgaySinh;
                _hp.QuocTich = obj.QuocTich;
                _hp.SoDienThoai = obj.SoDienThoai;
                _hp.MaLopKhoaNganhGUID = obj.MaLopKhoaNganhGUID;
                _hp.DiaChi = obj.DiaChi;
                _hp.Email = obj.Email;
                _hp.DaTotNghiep = obj.DaTotNghiep;
                db.SaveChanges();
                BizNhatKyHoatDong.Add<HocVien>(nhatKy, _hp);
                return CODE_RESULT_RETURN.ThanhCong;
            }
        }

        public static CODE_RESULT_RETURN Delete(string maHocVien)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var _hp = db.HocVienDbSet.Where(e => e.MaHocVien == maHocVien).FirstOrDefault();
                if (_hp == null)
                    return CODE_RESULT_RETURN.ThatBai;
                if ((_hp.HocVien_KetQuaHocTap != null && _hp.HocVien_KetQuaHocTap.Count > 0) ||
                    (_hp.LopHocPhan_BangDiemHocVien != null && _hp.LopHocPhan_BangDiemHocVien.Count > 0) ||
                    (_hp.LopHocPhan_HocVien != null && _hp.LopHocPhan_HocVien.Count > 0))
                    return CODE_RESULT_RETURN.ThatBai;
                db.HocVienDbSet.Remove(_hp);
                db.SaveChanges();
                NhatKyHoatDong nhatKy = new NhatKyHoatDong();
                BizNhatKyHoatDong.InitData<HocVien>(nhatKy, _hp, _hp.MaHocVien, LOAIDOITUONG.HỌC_VIÊN, LOAITHAOTAC.Xóa);
                BizNhatKyHoatDong.Add<HocVien>(nhatKy, null);
                return CODE_RESULT_RETURN.ThanhCong;
            }
        }

        public static string GenerateIDHocVien(int namTS, string maNganh, int defaultSTT = 1)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                string maHocVien = string.Format("{0:00}.{1}", namTS % 100, maNganh);
                var hv = db.HocVienDbSet
                    .Where(e => e.MaHocVien.Contains(maHocVien))
                    .OrderByDescending(e => e.MaHocVien).FirstOrDefault();
                if (hv == null)
                    return string.Format("{0}.{1:000}", maHocVien, defaultSTT);
                var strs = hv.MaHocVien.Split(new char[] { '.' });
                if (strs != null && strs.Count() == 3)
                {
                    var stt = int.Parse(strs[2]);
                    return string.Format("{0}.{1:000}", maHocVien, stt + 1);
                }
                else
                    return string.Format("{0}.{1:000}", maHocVien, defaultSTT);
            }
        }

        internal static object GetHocVien(string hoDem, string ten, string ngaySinh)
        {
            throw new NotImplementedException();
        }

        internal static CODE_RESULT_RETURN UpdateChungChi(HocVien obj)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var _hp = db.HocVienDbSet.Where(e => e.MaHocVien == obj.MaHocVien).FirstOrDefault();
                if (_hp == null)
                    return CODE_RESULT_RETURN.ThatBai;
                NhatKyHoatDong nhatKy = new NhatKyHoatDong();
                BizNhatKyHoatDong.InitData<HocVien>(nhatKy, _hp, obj.MaHocVien, LOAIDOITUONG.HỌC_VIÊN, LOAITHAOTAC.Chỉnh_sửa);
                _hp.LoaiChungChi = obj.LoaiChungChi;
                _hp.NgayCapChungChi = obj.NgayCapChungChi;
                _hp.NgoaiNgu = obj.NgoaiNgu;
                _hp.NoiCapChungChi = obj.NoiCapChungChi;
                _hp.GhiChu = obj.GhiChu;
                db.SaveChanges();
                BizNhatKyHoatDong.Add<HocVien>(nhatKy, _hp);
                return CODE_RESULT_RETURN.ThanhCong;
            }
        }
    }
}
